#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/un.h>

#define PARAMETROS 3


#define SOCKET_FILE "/tmp/socket_file"

int  Gfd;


//===========================================================
void Abortar (const char *msg) {
   fprintf (stderr, "Ponte: %s\n", msg);
   exit   (-1);

}

//===========================================================
void Conectar () {

    struct sockaddr_un addr;
   
   Gfd = socket (AF_UNIX, SOCK_STREAM, 0);

   memset (&addr, 0, sizeof(addr));

   addr.sun_family = AF_UNIX;
   
   strncpy (addr.sun_path, SOCKET_FILE, sizeof(addr.sun_path) - 1);

   if (connect (Gfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
     printf ("Simulator should be waiting connection.\n");
     exit   (1);
   }
}

//===========================================================
void Enviar (double *parametros) {

   for (int i = 0; i < PARAMETROS; i++)
      if (0 >= write (Gfd, &parametros[i], sizeof (double))) 
         Abortar ("Problema ao enviar parâmetros.\n");

}


//===========================================================
void Receber (double *valor) {

   while (0 >= read (Gfd, valor, sizeof (double))) ;
}


//===========================================================
void Finalizar () {
   close  (Gfd);
}



//===========================================================
//     PONTE ENTRE NOMAD E SIMULADOR
//===========================================================

int main (int argc, char *argv[]) {
 
   double  resposta
          ,parametros[PARAMETROS]
          ;

   FILE *oarquivo = fopen (argv[1], "rt");

   Conectar ();

    fscanf  (oarquivo, "%lf%lf%lf", &parametros[0], &parametros[1], &parametros[2]);
 
   // Envia parâmetros para o simulador.
   //printf ("ponte envia\n");
   Enviar  (parametros);

   // Recebe resposta e escreva na tela.
   //printf ("ponte recebe\n");
   Receber (&resposta);

   printf ("%16.15f\n", resposta);

   Finalizar ();

   return 0;
} 
